package com.uploadFile.config;

import cn.hutool.core.util.IdUtil;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.ObjectMetadata;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.function.Consumer;

/**
 * @Author pl711@qq.com
 * @PackageName uploadFile
 * @Package com.uploadFile.config
 * @Date 2024/5/10 23:03
 * @Version 1.0
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssConfig {
    // 阿里云API的外网域名
    private String endpoint;
    // 阿里云API的密钥Access Key ID
    private String accessKeyId;
    // 阿里云API的密钥Access Key Secret
    private String accessKeySecret;
     // 阿里云API的bucket名称
    private String bucketName;
    private String folder = "file/";

    public OSSClient getOSSClient() {
        return new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }


    /**
     * 下载文件
     * @param objectName 文件名称
     * @return
     */
// 下载文件
    public ByteArrayOutputStream getObject(String objectName) throws IOException {
        // 获取OSS客户端实例
        OSSClient ossClient = getOSSClient();

        // 获取指定对象的输入流
        InputStream inputStream = ossClient.getObject(bucketName, objectName).getObjectContent();

        // 创建一个输出流，用于存储下载的数据
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        // 由于Java 1.8不支持InputStream的readAllBytes()方法，我们使用while循环读取输入流
        // 分配一个缓冲区用于临时存储每次读取的数据
        byte[] buffer = new byte[1024];

        // 读取输入流，直到没有更多的数据
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            // 将缓冲区中的数据写入输出流
            outputStream.write(buffer, 0, bytesRead);
        }

        // 关闭OSS客户端，释放资源
        ossClient.shutdown();

        // 返回包含下载数据的输出流
        return outputStream;
    }
    // 上传图片到OSS
    public String uploadFile(MultipartFile file,String fileType) throws IOException {
        OSSClient ossClient = getOSSClient();
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 创建一个日期时间格式器，用于格式化为"yyyyMMdd"
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        // 格式化当前日期和时间
        String time = now.format(formatter);
        // hutool获取uuid作为文件名
        String simpleUUID = IdUtil.simpleUUID();
        // 获取file 文件后缀
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
        // 上传路径+文件名
        String objectName = folder+time+"/"+fileType+"/"+simpleUUID+"."+suffix;
        // 获取上传文件的输入流
        InputStream inputStream = file.getInputStream();
        // 调用OSS SDK的提交文件
        ossClient.putObject(bucketName, objectName, inputStream);
        // 断开连接
        ossClient.shutdown();
        return folder+time+"/"+fileType+"/"+simpleUUID+"."+suffix;
    }


    // 删除文件
    public void deleteObject(String objectName) {
        OSSClient ossClient = getOSSClient();
        // 删除文件
        System.out.println("删除文件");
        ossClient.deleteObject(bucketName, objectName);
        // 断开连接
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
}
